package kr.co.project1.base;

import java.lang.reflect.Field;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/**
 * 
 * 
 * 기본 Dto. 페이징정보 포함.
 */
public class BaseDto {

	/**
	 * 페이지번호
	 */
	private transient int page;
	/**
	 * 페이징당 레코드수
	 */
	private transient int pageSize;
	/**
	 * 페이지 시작 rownum
	 */
	private transient int startRownum;
	/**
	 * 페이지 끝 rownum
	 */
	private transient int endRownum;
	/**
	 * 총 페이지 레코드 수
	 */
	private transient int totalRecordCount;
    
    /**
     * 영향 받은 건수(insert,update,delete)
     */
    private transient int affectedCount;

	public int getPage() {
        if(page == 0) {            
    		return PageDto.DEFAULT_PAGE;
        } else {
    		return page;
            
        }
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getPageSize() {
        
        if(pageSize == 0) {            
            return PageDto.DEFAULT_PAGE_SIZE;
        } else {
            return pageSize;
        }
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getStartRownum() {
		return startRownum;
	}

	public void setStartRownum(int startRownum) {
		this.startRownum = startRownum;
	}

	public int getEndRownum() {
		return endRownum;
	}

	public void setEndRownum(int endRownum) {
		this.endRownum = endRownum;
	}

	public int getTotalRecordCount() {
		return totalRecordCount;
	}

	public void setTotalRecordCount(int totalRecordCount) {
		this.totalRecordCount = totalRecordCount;
	}

	@Override
	public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);                              
	}

    /**
     * <pre>영향 받은 건수(insert,update,delete)</pre>
     * @return the affectedCount    
     */
    public int getAffectedCount() {
        return affectedCount;
    }

    /**
     * <pre>영향 받은 건수(insert,update,delete)</pre>
     * @param affectedCount the affectedCount to set
     */
    public void setAffectedCount(int affectedCount) {
        this.affectedCount = affectedCount;
    }
    
    /**
     * pojo에 키를 정의하면 cache key를 toString을 사용하지 않는다.
     * @return 
     */
    public String getCacheKey() {
        return null;        
    }
    
	/**
	 * queryKeys에 기술된 키로 해당 필드들을 querystring으로 만들어준다.
	 * @param clazz
	 * @param queryKeys
	 * @return
	 */
	public String getQueryString(Class<?> clazz, String[] queryKeys){
		
		StringBuilder query = new StringBuilder();
		
		Field field = null;
		String value = null;
		
		try {
			for (int i = 0; i < queryKeys.length; i++) {
				field = clazz.getDeclaredField(queryKeys[i]);
				field.setAccessible(true);
				value = (String) field.get(this);
				if(StringUtils.isNotEmpty(value)){
					query.append(queryKeys[i]).append("=").append(value).append("&");
				}
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		
		if(query.lastIndexOf("&") != -1){
			query.deleteCharAt(query.lastIndexOf("&"));
		}
		
		return query.toString();
	}
}
